package com.ry.core.util;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Locale;

public class DateUtils {

	/** 日期时间格式 ：2007-08-20 16:14:16 */
	public static final DateFormat DATE_TIME_FORMAT = new SimpleDateFormat(
			"yyyy-MM-dd HH:mm:ss");

	/** 日期格式：2007-08-20 */
	public static final DateFormat DATE_FORMAT = new SimpleDateFormat(
			"yyyy-MM-dd");

	/** 日期格式：20070820 */
	public static final DateFormat yyyyMMdd_FORMAT = new SimpleDateFormat(
			"yyyyMMdd");

	/** 时间格式：16:07:40 */
	public static final DateFormat TIME_FORMAT = new SimpleDateFormat(
			"HH:mm:ss");

	/** 日期时间格式：08-20 16:15 */
	public static final DateFormat SHORT_DATE_TIME_FORMAT = new SimpleDateFormat(
			"MM-dd HH:mm");

	/** 日期中文格式：2007年9月20日 */
	public static final DateFormat CHINESE_DATE_FORMAT = new SimpleDateFormat(
			"yyyy年M月d日");

	/** 日期时间中文格式：2007年9月20日 15时 */
	public static final DateFormat CHINESE_DATE_TIME_FORMAT = new SimpleDateFormat("yyyy年M月d日H时");

	/** 日期中文格式：2007年9月20日 星期三 */
	public static final DateFormat CHINESE_DATE_WEEK_FORMAT = new SimpleDateFormat(
			"yyyy年M月d日 E");

	/** 日期时间格式 ：2007-08-20 16:14 */
	public static final DateFormat yyyy_MM_dd_HH_mm_FORMAT = new SimpleDateFormat(
			"yyyy-MM-dd HH:mm");

	/** 日期格式 ：2007 */
	public static final DateFormat yyyy_FORMAT = new SimpleDateFormat("yyyy");

	/** 日期格式 ：200709 */
	public static final DateFormat yyyyMM_FORMAT = new SimpleDateFormat(
			"yyyyMM");

	/** 日期格式 ：2007-09 */
	public static final DateFormat yyyy_MM_FORMAT = new SimpleDateFormat(
			"yyyy-MM");

	/**
	 * 测试日期字符串是否使用对应的模式
	 * 
	 * @param dateString
	 *            日期字符串
	 * 
	 * @param pattern
	 *            模式
	 * @return
	 */
	public static boolean isUsePattern(String dateString, String pattern) {
		if (dateString == null) {
			throw new NullPointerException();
		}

		SimpleDateFormat formatter = new SimpleDateFormat(pattern);
		try {
			formatter.parse(dateString);
			return true;
		} catch (ParseException ex) {
			return false;
		}
	}

	/**
	 * 获取指定的日期
	 * 
	 * @param date
	 * @param pattern
	 * @return
	 */
	public static String format(Date date, String pattern) {
		if (date == null) {
			return "";
		}

		SimpleDateFormat formatter = new SimpleDateFormat(pattern, Locale
				.getDefault());
		return formatter.format(date);
	}

	/**
	 * 获取指定的日期
	 * 
	 * @param date
	 * @param pattern
	 * @return
	 */
	public static String format(long longDate, String pattern) {
		Date tempDate = new Date(longDate);
		return format(tempDate, pattern);
	}

	/**
	 * String 转成 date类型
	 * 
	 * @param dateString
	 * @param pattern
	 * @return
	 */
	public static Date parse(String dateString, String pattern) {
		if (dateString == null || dateString.trim().length() == 0) {
			return null;
		}

		SimpleDateFormat formatter = new SimpleDateFormat(pattern);
		try {
			return formatter.parse(dateString);
		} catch (ParseException ex) {
			throw new IllegalArgumentException("Illegal datetime string "
					+ dateString);
		}
	}

	/**
	 * 日期String和日期格式转换成sql日期.
	 * 
	 * @param dateString
	 *            日期字符串
	 * @param pattern
	 *            日期格式串
	 * @return Date
	 */
	public static java.sql.Date parseSQLDate(String dateString, String pattern) {
		Date utilDate = parse(dateString, pattern);
		return (utilDate != null) ? (new java.sql.Date(utilDate.getTime()))
				: null;
	}

	/**
	 * util日期到sql日期.
	 * 
	 * @param pDate
	 *            Date
	 * @return Date
	 */
	public static java.sql.Date utilDate2sqlDate(java.util.Date pDate) {
		if (pDate == null)
			return null;
		long utilLong = pDate.getTime();
		java.sql.Date result = new java.sql.Date(utilLong);
		return result;
	}

	/**
	 * 后一天
	 * 
	 * @param date
	 * @return
	 */
	public static Date nextDate(Date now) {
		if (now == null) {
			throw new NullPointerException();
		}
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(now);
		calendar.add(Calendar.DATE, 1);
		return calendar.getTime();
	}

	/**
	 * 从传入日期对象中获取年份数据，当传入日期对象为<code>null</code>时，返回1990
	 * 
	 * @param date
	 * @return
	 */
	public static int getYearOfDate(Date date) {
		if (date == null) {
			return 1990;
		}
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(date);
		return calendar.get(Calendar.YEAR);
	}

	/**
	 * 从传入日期对象中获取月份数据，当传入日期对象为<code>null</code>时，返回1
	 * 
	 * @param date
	 * @return
	 */
	public static int getMonthOfDate(Date date) {
		if (date == null) {
			return 1;
		}
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(date);
		return calendar.get(Calendar.MONTH) + 1;
	}

	/**
	 * 从传入日期对象中获取日期数据，当传入日期对象为<code>null</code>时，返回1
	 * 
	 * @param date
	 * @return
	 */
	public static int getDayOfDate(Date date) {
		if (date == null) {
			return 1;
		}
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(date);
		return calendar.get(Calendar.DAY_OF_MONTH);
	}

	/**
	 * 获取日期对象的季度值
	 * 
	 * @param date
	 *            日期对象
	 * @return 季度值
	 */
	public static String getDayOfQuarter(Date date) {
		if (date == null) {
			return "";
		}
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(date);
		int i = calendar.get(Calendar.MONTH) + 1;
		if (i == 1 || i == 2 || i == 3) {
			return "一";
		} else if (i == 4 || i == 4 || i == 5) {
			return "二";
		} else if (i == 7 || i == 8 || i == 9) {
			return "三";
		} else {
			return "四";
		}
	}

	/**
	 * 获取日期对象的月份值
	 * 
	 * @param date
	 *            日期对象
	 * @return 月份值
	 */
	public static String getDayOfMonth(Date date) {
		if (date == null) {
			return "";
		}
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(date);
		int i = calendar.get(Calendar.MONTH) + 1;
		return i + " ";
	}

	/**
	 * 获取周工作日
	 * 
	 * @param date
	 * @return
	 */
	public static int getIntDayOfWeek(Date date) {
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(date);
		return calendar.get(Calendar.DAY_OF_WEEK);
	}

	/**
	 * 获取日期对象的星期值
	 * 
	 * @param date
	 *            日期对象
	 * @return 星期值
	 */
	public static String getDayOfWeek(Date date) {
		if (date == null) {
			return "";
		}
		int i = DateUtils.getIntDayOfWeek(date);
		String week = "";
		switch (i) {
		case 1:
			week = "日";
			break;
		case 2:
			week = "一";
			break;
		case 3:
			week = "二";
			break;
		case 4:
			week = "三";
			break;
		case 5:
			week = "四";
			break;
		case 6:
			week = "五";
			break;
		case 7:
			week = "六";
			break;
		}

		return week;
	}

	/**
	 * 计算两个时间的差值，返回以毫秒为单位的long
	 * 
	 * @param date1
	 * @param date2
	 * @return date1-date2
	 */
	public static long compareDateTime(Date date1, Date date2) {
		if (date1 == null) {
			long now = System.currentTimeMillis();
			date1 = new Date(now);
		}
		if (date2 == null) {
			long now = System.currentTimeMillis();
			date2 = new Date(now);
		}
		return date1.getTime() - date2.getTime();
	}

	/**
	 * 比较两个日期并返回两个日期相差多少天(d1－d2)
	 * 
	 * @param d1
	 *            Date
	 * @param d2
	 *            Date
	 * @return int
	 */
	public static int compareDateOnDay(Date d1, Date d2) {
		if (d1.getTime() == d2.getTime()) {
			return 0; // 日期相同返回0
		}
		int flag = -1;
		// 比较两个日期使日期较小的日期排在前面
		if (d1.getTime() > d2.getTime()) { // 日期一在日期二之后
			Date temp = d1;
			d1 = d2;
			d2 = temp;
			flag = 1;
		}
		Calendar c1 = Calendar.getInstance();
		Calendar c2 = Calendar.getInstance();
		c1.setTime(d1);
		c2.setTime(d2);
		int y1 = c1.get(Calendar.YEAR);
		int y2 = c2.get(Calendar.YEAR);
		int day1 = c1.get(Calendar.DAY_OF_YEAR);
		int day2 = c2.get(Calendar.DAY_OF_YEAR);
		int days = 0;
		for (int i = 1; i <= y2 - y1; i++) {
			days += getYearDays(y1);
		}
		return (days - day1 + day2) * flag;
	}

	/**
	 * 自己编写的得到一年的天数的方法
	 * 
	 * @param year
	 *            int 年份
	 * @return int （非闰年=365，闰年=366）
	 */
	public static int getYearDays(int year) {
		if (isLeapYear(year)) {
			return 366;
		}
		return 365;
	}

	/**
	 * 自己编写的判断闰年的方法
	 * 
	 * @param year
	 *            int 年份
	 * @return boolean（true=闰年，false=非闰年）
	 */
	public static boolean isLeapYear(int year) {
		if ((year % 400 == 0) || ((year % 4 == 0) && (year % 100 != 0))) {
			return true;
		}
		return false;
	}

	/**
	 * 计算两个时间的差值，返回以天为单位的int
	 * 
	 * @param date1
	 * @param date2
	 * @return date1-date2
	 */
	public static int compareDate(Date date1, Date date2) {
		DateFormat fmt = new SimpleDateFormat("yyyy-MM-dd");

		if (date1 == null) {
			date1 = new Date();
		}
		if (date2 == null) {
			date2 = new Date();
		}
		String t1 = fmt.format(date1);
		String t2 = fmt.format(date2);

		Calendar c1 = Calendar.getInstance();
		Calendar c2 = Calendar.getInstance();

		try {
			c1.setTime(fmt.parse(t1));
			c2.setTime(fmt.parse(t2));
		} catch (ParseException e) {
			e.printStackTrace();
		}
		int result = c1.compareTo(c2);
		return result;
	}

	/**
	 * 将毫秒转化成 天×小时零×分×秒
	 * 
	 * @param timeMills
	 * @return "天×小时零×分×秒"的字符格式, 如3天2小时35分23秒
	 * 
	 * @throws OAException
	 */
	public static String ms2HMS(long ms) {
		if (ms < 0)
			return null;
		long s = ms / 1000;
		long d = s / (3600 * 24);
		long h = (s - d * 3600 * 24) / 3600;
		long m = (s - d * 3600 * 24 - h * 3600) / 60;
		long ss = s - d * 3600 * 24 - h * 3600 - m * 60;
		String returnStr = "";
		if (d > 0)
			returnStr = returnStr + d + "天";
		if (h > 0)
			returnStr = returnStr + h + "小时";
		if (m > 0 && (d == 0))
			returnStr = returnStr + m + "分钟";
		if (returnStr.equals("") || (d == 0 && h == 0))
			returnStr = returnStr + ss + "秒";
		return returnStr;
	}

	/**
	 * 在某个日期上增加天数.
	 * 
	 * @param d
	 * @param days
	 * @return
	 */
	public static Date addDate(Date d, int days) {
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(d);
		calendar.set(Calendar.DAY_OF_MONTH, calendar.get(Calendar.DAY_OF_MONTH)
				+ days);
		return calendar.getTime();
	}

	/**
	 * 获取当前时间之后的day天是某一天(例如：2003年05月22日之后的23天是2003-06-14)
	 * 
	 * @param day
	 * @return 日期对象
	 * @throws Exception
	 */

	public static java.util.Date getAfterDate(int day) {
		long onetimes = (long) 1 * 24 * 60 * 60 * 1000; // 一天的毫秒数

		long now = System.currentTimeMillis();
		long after = now + onetimes * day;

		java.util.Date date = new java.util.Date(after);

		return date;

	}

	/**
	 * 获取当前时间之前的day天是某一天(例如：2003年05月22日之前的20天是2003-05-02)
	 * 
	 * @param day
	 * @return 当前时间之前的day天是某一天，以字符串格式返回,如2003-06-14
	 * @throws Exception
	 */

	public static String getBeforeDateString(int day) throws Exception {
		long onetimes = (long) 1 * 24 * 60 * 60 * 1000; // 一天的毫秒数

		long now = System.currentTimeMillis();
		long after = now - onetimes * day;

		java.util.Date date = new java.util.Date(after);

		return format(date, "yyyy-MM-dd");

	}

	/**
	 * 获取当前时间之前的day天是某一天(例如：2003年05月22日之前的20天是2003-05-02)
	 * 
	 * @param day
	 * @return 日期对象
	 * @throws Exception
	 */

	public static java.util.Date getBeforeDate(int day) {
		long onetimes = (long) 1 * 24 * 60 * 60 * 1000; // 一天的毫秒数

		long now = System.currentTimeMillis();
		long after = now - onetimes * day;

		java.util.Date date = new java.util.Date(after);

		return date;

	}

	/**
	 * 在某个日期上增加月数.
	 * 
	 * @param d
	 * @param months
	 * @return
	 */
	public static Date addMonth(Date d, int months) {
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(d);
		calendar.set(Calendar.MONTH, calendar.get(Calendar.MONTH) + months);
		return calendar.getTime();
	}

	/**
	 * 前一天
	 * 
	 * @param date
	 * @return
	 */
	public static Date preDate(Date date) {
		return new Date(date.getTime() - 24 * 60 * 60 * 1000);
	}

	/**
	 * 按给定的格式解析日期时间字符串
	 * 
	 * @param format
	 * @param datetime
	 * @return 如果格式不正确，返回null
	 */
	public static Date parse(DateFormat format, String datetime) {
		try {
			return format.parse(datetime);
		} catch (Exception e) {
			return null;
		}
	}

	/**
	 * 获取某个日期的最后一天
	 * 
	 * @param d
	 * @return
	 */
	public static int getLastDayOfMonth(Date d) {
		Calendar c = Calendar.getInstance();
		c.setTime(d);
		return c.getActualMaximum(c.DAY_OF_MONTH);
	}

	/**
	 * 获取某个月的天数
	 * 
	 * @param YYMM
	 *            如201202
	 * @return
	 */
	public static int getLastDayOfMonth(String YYMM) {
		String strDate = YYMM.substring(0, 7);
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM");
		Calendar calendar = new GregorianCalendar();
		try {
			Date date = sdf.parse(strDate);
			calendar.setTime(date);
			int day = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
			return day;
		} catch (Exception e) {
			return 0;
		}
	}

	/**
	 * 获取某个日期最后一天
	 * 
	 * @param date
	 * @return
	 */
	public static Date getLastDateOfMonth(Date date) {
		Calendar cal = Calendar.getInstance();
		cal.setTime(date);
		int value = cal.getActualMaximum(Calendar.DAY_OF_MONTH);
		cal.set(Calendar.DAY_OF_MONTH, value);
		return cal.getTime();
	}

	/**
	 * 得到当前日期"####-##-##"
	 * 
	 * @return 当前日期
	 */
	public static String getCurDate() {
		String fullDate = getCurYearMonth();
		int temp = getCurDay();
		if (temp < 10) {
			fullDate += "-0" + temp;
		} else {
			fullDate += "-" + temp;
		}
		return fullDate;
	}

	// ####-##
	public static String getCurYearMonth() {
		String fullDate = String.valueOf(getCurYear());
		int temp = getCurMonth();
		if (temp < 10) {
			fullDate += "-0" + temp;
		} else {
			fullDate += "-" + temp;
		}
		return fullDate;
	}

	// ##:##:##
	public static String getCurTime() {
		String time = getCurHourMinute();
		int temp = getCurSecond();
		if (temp < 10) {
			time += ":0" + temp;
		} else {
			time += ":" + temp;
		}
		return time;
	}

	// ##:##
	public static String getCurHourMinute() {
		String time;
		int temp = getCurHour();
		if (temp < 10) {
			time = "0" + temp + ":";
		} else {
			time = temp + ":";
		}
		temp = getCurMinute();
		if (temp < 10) {
			time += "0" + temp;
		} else {
			time += temp;
		}
		return time;
	}

	public static int getCurYear() {
		return Calendar.getInstance().get(Calendar.YEAR);
	}

	public static int getCurMonth() {
		return Calendar.getInstance().get(Calendar.MONTH) + 1;
	}

	public static int getCurDay() {
		return Calendar.getInstance().get(Calendar.DAY_OF_MONTH);
	}

	public static int getCurHour() {
		return Calendar.getInstance().get(Calendar.HOUR_OF_DAY);
	}

	public static int getCurMinute() {
		return Calendar.getInstance().get(Calendar.MINUTE);
	}

	public static int getCurSecond() {
		return Calendar.getInstance().get(Calendar.SECOND);
	}

	/**
	 * 得到一个日期对象
	 * 
	 * @return Date
	 */
	public static Date getDate() {
		return new Date(System.currentTimeMillis());
	}

	/**
	 * 得到一个SQL日期对象
	 * 
	 * @return Date
	 */
	public static java.sql.Date getSQLDate() {
		return new java.sql.Date(System.currentTimeMillis());
	}

	public static String getCurDateTime() {
		return getCurDate() + " " + getCurTime();
	}

	/**
	 * 比较日期字符串大小 如果d1>d2返回1 如果d1=d2返回0 如果d1<d2返回-1
	 * 
	 * @param d1
	 * @param d2
	 */
	public static int compareDateBig(Date d1, Date d2) {
		return new Long(d1.getTime()).compareTo(new Long(d2.getTime()));
	}

	/**
	 * 获取上个月最后一天
	 * 
	 * @return
	 */
	public static String getPreviousMonthEnd() {
		String str = "";
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");

		Calendar lastDate = Calendar.getInstance();
		lastDate.add(Calendar.MONTH, -1);// 减一个月
		lastDate.set(Calendar.DATE, 1);// 把日期设置为当月第一天
		lastDate.roll(Calendar.DATE, -1);// 日期回滚一天，也就是本月最后一天
		str = sdf.format(lastDate.getTime());
		return str;
	}

	public static void main(String[] args) {
		int i = getLastDayOfMonth("2012-12");
		System.out.println(i);
	}

}
